﻿/**
* @file menu_common.h
* @brief this is a brief description
* @details this is the detail description.
* @author fulong 
* @data 2014/11/19
* @version 1.0
* @par Copyright (c):
* @par First build
*     version: fulong 
*     data: 2014/11/19
*/
#ifndef __MENU_COMMON_H__
#define __MENU_COMMON_H__
#include "../../hal_include/hal_types.h"
//------------------------------------------------------
#define MENU_WIDGET_COUNT_MAX_LEN 50
#define MENU_MAX_COUNT 10
#define MENU_DISPLAY_TIME   25
/*!< 设置可控控件表的长度，长度的大小是下面的值乘以8的长度 */
#define CONTROLLABLE_WIDGET_MAX_LEN (MENU_WIDGET_COUNT_MAX_LEN/8)
#define MENU_FLASH_TIME 200

#define GET_CTRLLABLE_WRONG 0xFF
#define GET_VALUE_ERROR 0xFFFF
//------------------------------------------------------
typedef enum {
    STATIC_TEXT,
    SHIFT_TEXT,
    DAS_TEXT,
    DISPLAY_TEXT
}menu_text_seg_type;
typedef enum {
    MENU_CONTINUE_BUTTON_PRESS,
    MENU_BUTTON_PRESS
}menu_button_seg_type;

#define WIDGET_BUTTON_DELAY_ENABLE 1
#define WIDGET_BUTTON_DELAY_DISABLE 0

typedef enum {
    INNER_UNKNOWN,
    /*!< 当inner_proc_type为这个类型时，inner_proc_time的含义为循环操作间隔时间，extend_var的含义为设置循环的次数，0：无限次，1-255为1-255次 */
    LOOP_OPERA,
    /*!< 当inner_proc_type为这个类型时，inner_proc_time的含义为超时操作的时间,extend_var的含义为需要跳转的菜单号 */
    OVERTIME_OPERA
}menu_inner_proc_type;

typedef enum {          
    WIDGET_TEXT,
    WIDGET_BUTTON
}menu_text_proc_type;
typedef enum {          
    MENU_DIS_VAR,
    MENU_DIS_TEXT
}menu_dis_text_type;
typedef union {
    struct {
        uint8 static_txt_displayed:1;
        uint8 display_txt_displayed:1;
        uint8 reserve3:1;
        uint8 reserve4:1;
        uint8 reserve5:1;
        uint8 reserve6:1;
        uint8 reserve7:1;
    }flag;
    uint8 menu_flag_byte;
}menu_flag_struct;
typedef union {
    struct {
        /*!<  这个控件属于的父类型*/
        uint8 widget_proc_type:1;
        /*!< 这个控件所在的菜单号  */
        uint8 menu_id4widget:7;
    }bit0_widget_seg;
    uint8 bit0_widget_value;
} bit0_widget;
typedef union {
    struct {
        /*!<  这个控件属于的子类型*/
        uint8 widget_seg_type:2;
        /*!< 控件号 */
        uint8 menu_widget_id:6;
    }bit1_widget_seg;
    uint8 bit1_widget_value;
} bit1_widget;
typedef struct {
    bit0_widget widget_seg0;
    bit1_widget widget_seg1;
} widget_seg_struct;
typedef union {
    widget_seg_struct menu_widget_seg;
    uint16 widget_id_value;
} widget_type;

/*!<菜单控件表,长度由所有菜单中控件的总数 */
typedef struct {
    void *menu_table[ MENU_WIDGET_COUNT_MAX_LEN ];
    /*!< 目前所创建的控件数 */
    uint8 menu_widget_count;
}menu_id_table_struct;
/*!< 菜单控件索引表,长度是由菜单的总数决定 */
typedef struct {
    uint8 menu_table_index[ MENU_MAX_COUNT ];
    /*!< 目前所创建的菜单数 */
    uint8 menu_count;
}menu_id_table_index_struct;

typedef struct {
    widget_type static_txt_widget_id;
    const uint8 *static_text;
    uint8 static_text_x;
    uint8 static_text_y;
} static_text_widget_struct;
//#pragma STRUCT display_text_widget_struct unpack
typedef struct {
    widget_type dis_txt_widget_id;
    uint16 dis_var;
    uint8 dis_type;
    uint8 flash_enable;
    uint8 dis_text_x;
    uint8 dis_text_y;
    __far uint8 *dis_txt;
    __far uint8 *dis_txt_old;
    uint8 delay_flash_flag;
    uint8 display_clr_flag;
} display_text_widget_struct;
typedef struct {
    /*!< 当前菜单的菜单数 */
    uint8 menu_num;
    /*!< 当前显示的控件索引 */
    uint8 cur_dis_widget_num;
    /*!< 当前菜单控件数 */
    uint8 menu_widget_len;
    /*!< 用来绑定当前菜单的内部处理函数 */
    void (*menu_inner_proc_fun)(void);
}menu_struct;
typedef struct {
    /*!< 设定菜单内部处理的类型 */
    uint8 inner_proc_type;
    /*!< 设定菜单内部处理的时间，根据上面的类型，下面时间的含义有区别。 */
    uint32 inner_proc_time;
    /*!< 指定哪个变量用在内部循环操作中 */
    uint16* inner_proc_value;
    /*!< 这个是指定更新inner_proc_value的值的函数 */
    uint16 (*inner_proc_fun)(void);
    /*!<处理的拓展变量,根据处理类型变化而变化 */
    uint8 extend_var;
}inner_proc_struct;
typedef struct {
    widget_type button_widget_id;
    void (*menu_button_proc_fun)(void);
    uint16 delay_button_time;
    uint32 bind_key;
    uint32 delay_button_node;
}menu_button_struct;
typedef struct {
    uint8 menu_controllabe_table[ CONTROLLABLE_WIDGET_MAX_LEN ];
    uint8 menu_controllable_pointer;
    uint8 controllable_widget_len;
    uint8 right_edge;
    uint8 left_edge;
}menu_controllable_strcut;
#endif /* __MENU_COMMON_H__ */


